﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once        
#include "IFamilyEntity.h"
#include "GmFamilyService.h"


namespace gfam
{
    class IFamilySketchCurve;
    class IFamilyConstraint;
    /// \brief  草图的接口类
    ///
    /// 目前草图分为二维草图和三维草图
    class GM_FAMILY_SERVICE_EXPORT IFamilySketch : public IFamilyEntity
    {
        DEFINE_CAST_DERIVED(gfam::IFamilySketch, gfam::IFamilyEntity)
    public:
        /// \brief 析构函数
        virtual ~IFamilySketch() {};

        /// \brief 通过传入某个元素的ElementId，判断其是否在草图内
        /// 
        /// \param id 要查询元素的ElementId
        /// \return 若此元素在草图内则返回true，否则返回false
        virtual bool IsIn(const gcmp::ElementId& id) const = 0;

        /// \brief 设置草图内所有元素的可见性
        /// 
        /// \param bIsVisible 元素是否可见
        /// \return 若设置成功则返回true，否则返回false
        virtual bool SetChildVisible(bool bIsVisible) = 0;

        /// \brief 获取草图所属实体的ElementId
        /// 
        /// \return 草图所属实体的ElementId
        virtual gcmp::ElementId GetOwnerFormId() const = 0;

        /// \brief 设置草图所属实体的ElementId
        /// 
        /// \param id 实体的ElementId
        /// \return 若设置成功则返回true，否则返回false
        virtual bool SetOwnerFormId(const gcmp::ElementId& id) = 0;

        /// \brief 获取草图内所有的Curve元素
        /// 
        /// \param curves 用来保存返回结果的数组
        /// \return 无
        virtual void GetAllCurves(std::vector<IFamilySketchCurve*>& curves) const = 0;

        /// \brief 获取草图平面的坐标系
        /// 
        /// \return 草图平面的坐标系
        virtual gcmp::Coordinate3d GetSketchPlaneCoord() const = 0;

        /// \brief 设置草图内所有元素（约束除外）的可见性
        /// 
        /// \param bIsVisible 元素是否可见
        /// \return 若设置成功则返回true，否则返回false
        virtual bool SetChildVisibleExceptConstraint(bool bIsVisible) = 0;

        /// \brief 设置草图依赖的对象的ElementId（专门为约束解算设计）
        /// 
        /// \param dependentElementIds 用来保存返回结果的数组
        /// \return 无
        virtual void GetDependentElementIds(std::vector<gcmp::ElementId>& dependentElementIds) const = 0;

        /// \brief 获取草图内所有的约束对象
        /// 
        /// \param curves 用来保存返回结果的数组
        /// \return 无
        virtual void GetAllConstraints(std::vector<IFamilyConstraint*>& constraints) const = 0;

        /// \brief 清除草图中的所有对象
        /// 
        /// \return 操作成功返回true,否则返回false
        virtual bool Clear() = 0;

        /// \brief 移除对象
        /// 
        /// \param id 对象id
        /// \return 操作成功返回true,否则返回false
        virtual bool RemoveObject(const gcmp::ElementId& id) = 0;

        /// \brief 添加对象
        /// 
        /// \param id 对象id
        /// \return 操作成功返回true,否则返回false
        virtual bool AddObject(const gcmp::ElementId& id) = 0;

        /// \brief 获取草图中的所有对象
        /// 
        /// \param sketchObjects 保存草图中的所有对象
        virtual void GetAllObjects(std::vector<gcmp::IElement*>& sketchObjects) const = 0;

        /// \brief 获得草图上的所有轮廓曲线，包括2D和3D曲线，不包括轴线，定位线等
        /// 
        /// \param curves 保存草图中的所有所有轮廓曲线
        virtual void GetAllCurvesNormal(std::vector<IFamilySketchCurve*>& curves)const = 0;

        /// \brief 获得草图上的所有对象id
        /// 
        /// \return 草图中的所有对象id集合
        virtual const std::vector<gcmp::ElementId>& GetSketchObjectIds() const = 0;

        /// \brief 获取草图平面id
        /// 
        /// \return 草图平面id
        virtual gcmp::ElementId GetSketchPlaneId() const = 0;

        /// \brief 设置草图平面id
        /// 
        /// \param 草图平面id
        /// \return 操作成功返回true,否则返回false
        virtual bool SetSketchPlaneId(const gcmp::ElementId& sketchPlaneId) = 0;

        /// \brief 获取结束编辑关联更新id
        /// 
        /// \return 关联更新id
        virtual RegenDataId GetFinishEditingRdId() const = 0;

        /// \brief 草图上的所有曲线Id
        /// 
        /// \param curveIds  保存所有曲线Id
        virtual void GetAllCurveIds(std::vector<gcmp::ElementId>& curveIds)const = 0;


        /// \brief 设置草图上所有约束对象的可见性
        /// 
        /// \param visible 可见性  
        virtual void SetChildConstraintVisible(bool visible) = 0;


        /// \brief 获取草图对象关联更新id
        /// 
        /// \return 关联更新id
        virtual RegenDataId GetSketchObjectIdsRdId() const = 0;

    };
}